package com.sbtr.business.trainingserver.service;

import com.alibaba.fastjson.JSONArray;
import com.sbtr.open.importmodel.dto.ImportModelTaskDto;
import com.sbtr.open.publishtask.dto.PublishTaskDataDto;
import com.sbtr.open.trainingmodel.dto.TrainingModelDataDto;
import com.sbtr.open.trainingserver.dto.TrainingServerDto;
import com.sbtr.open.trainingtask.dto.TrainingInfoDto;
import lombok.Getter;
import lombok.Setter;

import java.io.IOException;
import java.util.List;

//import com.sbtr.business.publishtask.dto.PublishTaskDto;
//import com.sbtr.business.trainingtask.dto.TrainingTaskDataDto;
//import com.sbtr.business.trainingtask.dto.TrainingTaskDto;

/**
 * 向部署服务器发送http请求
 *
 * @author ex_chenyj
 */
public interface IPublishServerHttpApi {

    /**
     * 向当前服务器加入部署任务
     *
     * @param serverDto
     *            服务器信息
     * @param trainingTaskDto
     *            训练任务信息
     * @param publishTaskDto
     *            部署任务信息
     * @param trainingModelDto
     *            训练模型信息
     * @return
     */
//	public boolean addTask(TrainingServerDto serverDto, TrainingTaskDto trainingTaskDto, PublishTaskDto publishTaskDto,
//			TrainingModelDto trainingModelDto);

    /**
     * 向当前服务器加入部署任务(数据预测)
     * <p>
     * //	 * @param serverDto
     * //	 *            服务器信息
     * //	 * @param trainingTaskDto
     * //	 *            训练任务信息
     * //	 * @param publishTaskDto
     * //	 *            部署任务信息
     * //	 * @param trainingModelDto
     * 训练模型信息
     *
     * @return
     */
//	public boolean addTaskData(TrainingServerDto serverDto, TrainingTaskDataDto trainingTaskDataDto,
//			PublishTaskDataDto publishTaskDataDto, TrainingModelDataDto trainingModelDataDto);
    public boolean addTaskData2(TrainingServerDto serverDto, TrainingInfoDto trainingInfoDto,
                                PublishTaskDataDto publishTaskDataDto, TrainingModelDataDto trainingModelDataDto);

    public boolean publishExternalModel2(TrainingServerDto serverDto,
                                         PublishTaskDataDto publishTaskDataDto, TrainingModelDataDto trainingModelDataDto);


    /**
     * 任务下线
     *
     * @param serverDto 服务器信息
     * @param taskId    部署任务id
     * @return
     */
    public boolean stopTask(TrainingServerDto serverDto, long taskId);

    /**
     * 任务下线 (数据预测)
     *
     * @param serverDto 服务器信息
     * @param taskId    部署任务id
     * @return
     */
    public boolean stopTaskData(TrainingServerDto serverDto, long taskId);

    /**
     * 获取当前服务器任务列表 <b>注意:</b> 已经下线的任务会被移除队列，此接口获取不了已经下线的任务信息
     *
     * @param serverDto
     * @return
     */
    public List<TaskInfo> getTaskList(TrainingServerDto serverDto);

    /**
     * 获取当前服务器任务列表 <b>注意:</b> 已经下线的任务会被移除队列，此接口获取不了已经下线的任务信息 (数据预测类使用)
     *
     * @param serverDto
     * @return
     */
    public List<TaskInfo> getTaskListData(TrainingServerDto serverDto);

    /**
     * 预检测图片
     *
     * @param serverDto
     * @param taskId
     * @param imgBase64 图片的base64字符串
     * @param extparams 音频检测时额外参数,音频的采样率
     * @return
     */
    public List<PredictInfo> predictPic(TrainingServerDto serverDto, long taskId, String imgBase64, Long extparams);

    /**
     * 预测图像分割图片
     *
     * @param serverDto
     * @param taskId
     * @param imgBase64
     * @param extparams
     * @return
     */
    public String predictSegmentPic(TrainingServerDto serverDto, long taskId, String imgBase64, Long extparams);

    /**
     * 预测文本数据 这一步直接获取预测端返回来的数据不做任何的的处理
     *
     * @param serverDto
     * @param taskId
     * @param pData
     * @return
     */
    public JSONArray predictData(TrainingServerDto serverDto, long taskId, JSONArray pData);


    public String predictData(long modelId, long predictTaskId);

    public boolean predictBigData(TrainingServerDto serverDto, long taskId, String predictId);

    /**
     * gpu服务器是否在线(实时) 通过getTaskList接口实时检测服务器是否在线
     *
     * @param serverDto
     * @return
     */
    public boolean serverIsOnline(TrainingServerDto serverDto, String projectType);

    /**
     * 生成离线模型文件
     *
     * @param serverDto
     * @param trainingTaskDto
     * @param trainingModelDto
     * @return 离线模型文件保存路径
     */
//	public String getSdk(TrainingServerDto serverDto, TrainingTaskDto trainingTaskDto,
//			TrainingModelDto trainingModelDto);

    /**
     * 生成数据数据预测离线模型文件
     *
     //	 * @param trainingTaskDto
     //	 * @param trainingModelDto
     * @return 获取离线保存文件
     * @throws IOException
     */
//	public String getDataSdk(TrainingTaskDataDto trainingTaskDto, TrainingModelDataDto trainingModelDto) throws IOException;

    /**
     * 发布外部模型
     *
     * @param serverDto
     * @param task
     * @return
     */
    public String publishExternalModel(TrainingServerDto serverDto, ImportModelTaskDto task);

    @Getter
    @Setter
    public static class TaskInfo {
        private String taskid; // 任务id
        private Long waittime; // 任务预计跑完时间，单位秒
    }

    @Getter
    @Setter
    public static class PredictInfo {
        private Integer classindex;
        private Double prob;
        private Double x;
        private Double y;
        private Double w;
        private Double h;
    }

    @Getter
    @Setter
    public static class PredictData {
        private Integer classindex; // 类别 0, 1, 2, 3
        private String classifier; // 类型 类似 "yes", "no"
    }

}